#ifndef AVL_H
#define AVL_H

#include "IArbol.h"
#include "NodoAVL.h"
#include "Puntero.h"
#include "Comparador.h"

template <class T>
class AVL: public IArbol<T>
{
public:

	
	AVL(Puntero<Comparador<T>> comparador);

//	AVL(Comparador<T> comparadorAux);
		
	void Insertar(const T &x);

	bool EsVacio() const; 

	const T& Raiz() const;
	
	const T& Maximo() const;

	const T& Minimo() const;

	bool Existe(const T &x) const; 

	void Borrar(const T &x);

	void BorrarTodo();

	const T& Recuperar(const T&) const;

	Iterador<T> ObtenerIterador() const;

	
private:

	Puntero<NodoAVL<T>> raiz;
	Puntero<Comparador<T>> comparadorClave;
	bool varioH;
	int tamanio;
		
	Puntero<NodoAVL<T>> crearNodoAVL(const T &dato);	
	 
    int Altura(Puntero<NodoAVL<T>> nodo) const;
 
	Puntero<NodoAVL<T>> insertarEnAVL(const T &dato, Puntero<NodoAVL<T>> &nodoAVL);
	const T& obtenerMaximo(const Puntero<NodoAVL<T>> &nodo) const;
	const T& obtenerMinimo(const Puntero<NodoAVL<T>> &nodo) const;
	bool existeDato(const T &dato, const Puntero<NodoAVL<T>> &nodo) const;
	const T& recuperarDato(const T &dato, const Puntero<NodoAVL<T>> &nodo) const;
	bool borrarEnAVL(const T &dato, Puntero<NodoAVL<T>> &nodo);
	void rotacionSimpleDer(Puntero<NodoAVL<T>> &nodo);
	void rotacionSimpleIzq(Puntero<NodoAVL<T>> &nodo);
	void rotacionDobleDer(Puntero<NodoAVL<T>> &nodo);
	void rotacionDobleIzq(Puntero<NodoAVL<T>> &nodo);
	void BorrarTodoElArbol(Puntero<NodoAVL<T>> &nodo);
};

#include "AVL.cpp"

#endif